import { changeArrField } from "."

/**
 * @param {String} form 需要设置的表单
 * @param {String} names 需要获取数据字典的名称 (多个以逗号隔开)
 * @param {Function} db 回调方法
 * @param {Array}  transitionArr 需要装换的字段
 * @description 将数据字典中内容设置到表单的 children 中
 */
export const setDictionaries = async (form, names, transitionArr = [], db) => {
  // 数据字典内容
  const data = await dictionaryByName({ names })
  // 如果数据字典中一个值都没有
  if (!data) {
    db && db()
    return
  }
  // 需要设置到表单中的内容集合
  let obj = {}

  // 数据字段获取的个数
  const namesLength = names.split(",").length
  const transitionLength = transitionArr.length

  // 当数据字典中  表单有两个或以上使用的是同一个 数据字典字段时  会 transitionLength > namesLength
  const length = namesLength > transitionLength ? namesLength : transitionLength
  // 是否已设置完成
  let count = 0

  if (transitionArr.length) {
    obj = data
    // 字段替换
    for (const item of transitionArr) {
      const { newField, oldField } = item || {}
      obj[newField] = data[oldField]
    }
  } else {
    obj = data
  }

  // 将数据字段中内容设置到表单中
  for (let i = 0; i < form.options.length; i++) {
    const { prop } = form.options[i]
    if (obj[prop]) {
      count++
      form.options[i].children = changeArrField(obj[prop], "value")

      // 回填所有的数据字典后 跳出循环
      if (count >= length) {
        break
      }
    }
  }

  db && db()
}

/**
 * @param {Object} form 需要改变的表单
 * @param {Array} fields 需要设置的字段
 * @param {Boolean} flag 启用 false / 禁用 true
 * @param {String} type 修改的类型 disabled 启用/禁用   hide 隐藏 / 显示
 * @description 设置表单项是否禁用
 */
export const chanegFormItemStatus = async (form, fields, flag = false, type = "disabled") => {
  let count = 0
  for (const item of form.options) {
    const { prop, type: itemType } = item || {}

    if (!item.attrs) {
      continue
    }
    if (!fields?.length || fields.includes(prop)) {
      if (type === "disabled") {
        if (itemType === "data_picker") {
          item.attrs.readonly = flag
        } else {
          item.attrs.disabled = flag
        }
        count++
      } else if (type === "hide") {
        item.hide = flag
        count++
      }
    }

    // 设置完成直接跳出循环
    if (fields?.length && count >= fields.length) {
      break
    }
  }
}

/**
 * @param {string} cacheField 缓存的字段
 * @param {Object} form 需要回填的表单
 * @param {Object} params 回填的参数
 * @description 回填表单内容 Cache field
 */
export const backfillFormParams = (cacheField = "", data = {}, newParams = {}, db) => {
  if (cacheField) {
    let params = uni.getStorageSync(cacheField)
    if (params) {
      params = JSON.parse(params)
      setTimeout(() => {
        Object.keys(params).forEach(key => {
          data.form[key] = params[key] ? params[key] : data.form[key] || ""
        })
      }, 0)
    }
  } else {
    setTimeout(() => {
      Object.assign(data.form, newParams)
    }, 0);
  }
  if (db) {
    setTimeout(() => {
      db()
    }, 1);
  }
}
